Introduce a new parser state for accelerator elements to avoid misparsing
authorMatthias Clasen <maclas@gmx.de>
Fri, 9 Jan 2004 21:22:38 +0000 (21:22 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 9 Jan 2004 21:22:38 +0000 (21:22 +0000)
Fri Jan  9 22:23:45 2004  Matthias Clasen  <maclas@gmx.de>

* gtk/gtkuimanager.c: Introduce a new parser state for
accelerator elements to avoid misparsing files containing
such elements.  (#131035, Morten Welinder)

ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gtk/gtkuimanager.c

index df276379b7c4a2986db2cdae14927beb46647dc0..ac47526e7586ffca7e16d5f032a264e3f1d56e2e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jan  9 22:23:45 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.c: Introduce a new parser state for 
+       accelerator elements to avoid misparsing files containing 
+       such elements.  (#131035, Morten Welinder)
+
 Fri Jan  9 11:58:47 2004  Manish Singh  <yosh@gimp.org>
 
        * gdk-pixbuf/gdk-pixbuf-io.c: #include <unistd.h> for unlink()
index df276379b7c4a2986db2cdae14927beb46647dc0..ac47526e7586ffca7e16d5f032a264e3f1d56e2e 100644 (file)
@@ -1,3 +1,9 @@
+Fri Jan  9 22:23:45 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.c: Introduce a new parser state for 
+       accelerator elements to avoid misparsing files containing 
+       such elements.  (#131035, Morten Welinder)
+
 Fri Jan  9 11:58:47 2004  Manish Singh  <yosh@gimp.org>
 
        * gdk-pixbuf/gdk-pixbuf-io.c: #include <unistd.h> for unlink()
index df276379b7c4a2986db2cdae14927beb46647dc0..ac47526e7586ffca7e16d5f032a264e3f1d56e2e 100644 (file)
@@ -1,3 +1,9 @@
+Fri Jan  9 22:23:45 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.c: Introduce a new parser state for 
+       accelerator elements to avoid misparsing files containing 
+       such elements.  (#131035, Morten Welinder)
+
 Fri Jan  9 11:58:47 2004  Manish Singh  <yosh@gimp.org>
 
        * gdk-pixbuf/gdk-pixbuf-io.c: #include <unistd.h> for unlink()
index df276379b7c4a2986db2cdae14927beb46647dc0..ac47526e7586ffca7e16d5f032a264e3f1d56e2e 100644 (file)
@@ -1,3 +1,9 @@
+Fri Jan  9 22:23:45 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.c: Introduce a new parser state for 
+       accelerator elements to avoid misparsing files containing 
+       such elements.  (#131035, Morten Welinder)
+
 Fri Jan  9 11:58:47 2004  Manish Singh  <yosh@gimp.org>
 
        * gdk-pixbuf/gdk-pixbuf-io.c: #include <unistd.h> for unlink()
index df276379b7c4a2986db2cdae14927beb46647dc0..ac47526e7586ffca7e16d5f032a264e3f1d56e2e 100644 (file)
@@ -1,3 +1,9 @@
+Fri Jan  9 22:23:45 2004  Matthias Clasen  <maclas@gmx.de>
+
+       * gtk/gtkuimanager.c: Introduce a new parser state for 
+       accelerator elements to avoid misparsing files containing 
+       such elements.  (#131035, Morten Welinder)
+
 Fri Jan  9 11:58:47 2004  Manish Singh  <yosh@gimp.org>
 
        * gdk-pixbuf/gdk-pixbuf-io.c: #include <unistd.h> for unlink()
index 953756e0970772328de2cd0f6929e9584deb022f..f18e2c8ec2a4407798d4fe09536107cda152b3a4 100644 (file)
@@ -862,6 +862,7 @@ typedef enum
   STATE_TOOLBAR,
   STATE_MENUITEM,
   STATE_TOOLITEM,
+  STATE_ACCELERATOR,
   STATE_END
 } ParseState;
 
@@ -948,7 +949,7 @@ start_element_handler (GMarkupParseContext *context,
     case 'a':
       if (ctx->state == STATE_ROOT && !strcmp (element_name, "accelerator"))
        {
-         ctx->state = STATE_ROOT;
+         ctx->state = STATE_ACCELERATOR;
          ctx->current = get_child_node (self, ctx->current,
                                         node_name, strlen (node_name),
                                         NODE_TYPE_ACCELERATOR,
@@ -1161,6 +1162,7 @@ end_element_handler (GMarkupParseContext *context,
       break;
     case STATE_MENU:
     case STATE_TOOLBAR:
+    case STATE_ACCELERATOR:
       ctx->current = ctx->current->parent;
       if (NODE_INFO (ctx->current)->type == NODE_TYPE_ROOT) 
        ctx->state = STATE_ROOT;
@@ -1578,6 +1580,7 @@ find_menu_position (GNode      *node,
                        NODE_INFO (node)->type == NODE_TYPE_SEPARATOR,
                        FALSE);
 
+  g_print ("find_menu_position %s\n", NODE_INFO (node)->name);
   /* first sibling -- look at parent */
   if (node->prev == NULL)
     {
@@ -1601,6 +1604,7 @@ find_menu_position (GNode      *node,
            pos = 1;
          else
            pos = 0;
+         g_print ("parent is menu, pos %d\n", pos);
          g_list_free (siblings);
          break;
        case NODE_TYPE_MENU_PLACEHOLDER:
@@ -1608,6 +1612,7 @@ find_menu_position (GNode      *node,
          g_return_val_if_fail (GTK_IS_MENU_SHELL (menushell), FALSE);
          pos = g_list_index (GTK_MENU_SHELL (menushell)->children,
                              NODE_INFO (parent)->proxy) + 1;
+         g_print ("parent is menu placeholder, pos %d\n", pos);
          break;
        default:
          g_warning("%s: bad parent node type %d", G_STRLOC,
@@ -1631,6 +1636,9 @@ find_menu_position (GNode      *node,
       g_return_val_if_fail (GTK_IS_MENU_SHELL (menushell), FALSE);
 
       pos = g_list_index (GTK_MENU_SHELL (menushell)->children, prev_child) + 1;
+      g_print ("previous is %s, pos %d\n", 
+              NODE_INFO (sibling)->type == NODE_TYPE_MENU_PLACEHOLDER ? "placeholder" : "menuitem", 
+              pos);
     }
 
   if (menushell_p)
@@ -1762,6 +1770,7 @@ update_smart_separators (GtkWidget *proxy)
 {
   GtkWidget *parent = NULL;
   
+  g_print ("update_smart_separators %s\n", gtk_widget_get_name (proxy));
   if (GTK_IS_MENU (proxy) || GTK_IS_TOOLBAR (proxy))
     parent = proxy;
   else if (GTK_IS_MENU_ITEM (proxy) || GTK_IS_TOOL_ITEM (proxy))
@@ -1774,6 +1783,7 @@ update_smart_separators (GtkWidget *proxy)
       gboolean empty;
       GList *children, *cur, *last;
       GtkWidget *filler;
+      gint i;
 
       children = gtk_container_get_children (GTK_CONTAINER (parent));
       
@@ -1782,9 +1792,11 @@ update_smart_separators (GtkWidget *proxy)
       empty = TRUE;
       filler = NULL;
 
+      i = 0;
       cur = children;
       while (cur) 
        {
+         g_print ("%d. %s\n", i++, G_OBJECT_TYPE_NAME (cur->data));
          if (g_object_get_data (cur->data, "gtk-empty-menu-item"))
            filler = cur->data;
 
@@ -1797,22 +1809,27 @@ update_smart_separators (GtkWidget *proxy)
              switch (mode) 
                {
                case SEPARATOR_MODE_VISIBLE:
+                 g_print ("visible\n");
                  gtk_widget_show (GTK_WIDGET (cur->data));
                  last = NULL;
                  visible = FALSE;
                  break;
                case SEPARATOR_MODE_HIDDEN:
+                 g_print ("hidden\n");
                  gtk_widget_hide (GTK_WIDGET (cur->data));
                  break;
                case SEPARATOR_MODE_SMART:
                  if (visible)
                    {
+                     g_print ("smart, visible\n");
                      gtk_widget_show (GTK_WIDGET (cur->data));
                      last = cur;
                      visible = FALSE;
                    }
-                 else
-                   gtk_widget_hide (GTK_WIDGET (cur->data));
+                 else 
+                   {  g_print ("smart, hidden\n");
+                     gtk_widget_hide (GTK_WIDGET (cur->data));
+                   }
                  break;
                }
            }
@@ -1831,8 +1848,10 @@ update_smart_separators (GtkWidget *proxy)
          cur = cur->next;
        }
 
-      if (last)
+      if (last) {
+       g_print ("hide last separator\n");
        gtk_widget_hide (GTK_WIDGET (last->data));
+      }
 
       if (GTK_IS_MENU (parent)) 
        {
@@ -1946,6 +1965,7 @@ update_node (GtkUIManager *self,
          if (info->proxy == NULL)
            {
              info->proxy = gtk_menu_bar_new ();
+             gtk_widget_set_name (info->proxy, info->name);
              gtk_widget_show (info->proxy);
              g_signal_emit (self, merge_signals[ADD_WIDGET], 0, info->proxy);
            }
@@ -1953,6 +1973,7 @@ update_node (GtkUIManager *self,
        case NODE_TYPE_POPUP:
          if (info->proxy == NULL) 
            info->proxy = gtk_menu_new ();
+         gtk_widget_set_name (info->proxy, info->name);
          break;
        case NODE_TYPE_MENU:
          {
@@ -1960,8 +1981,8 @@ update_node (GtkUIManager *self,
            GtkWidget *menu;
            GList *siblings;
            /* remove the proxy if it is of the wrong type ... */
-           if (info->proxy &&  G_OBJECT_TYPE (info->proxy) !=
-               GTK_ACTION_GET_CLASS (action)->menu_item_type)
+           if (info->proxy &&  
+               G_OBJECT_TYPE (info->proxy) != GTK_ACTION_GET_CLASS (action)->menu_item_type)
              {
                prev_submenu = gtk_menu_item_get_submenu (GTK_MENU_ITEM (info->proxy));
                if (prev_submenu)
@@ -1987,6 +2008,8 @@ update_node (GtkUIManager *self,
 
                    info->proxy = gtk_action_create_menu_item (action);
                    menu = gtk_menu_new ();
+                   gtk_widget_set_name (info->proxy, info->name);
+                   gtk_widget_set_name (menu, info->name);
                    tearoff = gtk_tearoff_menu_item_new ();
                    gtk_widget_set_no_show_all (tearoff, TRUE);
                    gtk_menu_shell_append (GTK_MENU_SHELL (menu), tearoff);
@@ -2028,6 +2051,7 @@ update_node (GtkUIManager *self,
          if (info->proxy == NULL)
            {
              info->proxy = gtk_toolbar_new ();
+             gtk_widget_set_name (info->proxy, info->name);
              gtk_widget_show (info->proxy);
              g_signal_emit (self, merge_signals[ADD_WIDGET], 0, info->proxy);
            }
@@ -2118,8 +2142,8 @@ update_node (GtkUIManager *self,
          break;
        case NODE_TYPE_MENUITEM:
          /* remove the proxy if it is of the wrong type ... */
-         if (info->proxy &&  G_OBJECT_TYPE (info->proxy) !=
-             GTK_ACTION_GET_CLASS (action)->menu_item_type)
+         if (info->proxy &&  
+             G_OBJECT_TYPE (info->proxy) != GTK_ACTION_GET_CLASS (action)->menu_item_type)
            {
              g_signal_handlers_disconnect_by_func (info->proxy,
                                                    G_CALLBACK (update_smart_separators),
@@ -2138,6 +2162,7 @@ update_node (GtkUIManager *self,
              if (find_menu_position (node, &menushell, &pos))
                {
                  info->proxy = gtk_action_create_menu_item (action);
+                 gtk_widget_set_name (info->proxy, info->name);
                  
                  gtk_menu_shell_insert (GTK_MENU_SHELL (menushell),
                                         info->proxy, pos);
@@ -2185,6 +2210,7 @@ update_node (GtkUIManager *self,
              if (find_toolbar_position (node, &toolbar, &pos))
                {
                  info->proxy = gtk_action_create_tool_item (action);
+                 gtk_widget_set_name (info->proxy, info->name);
 
                  gtk_toolbar_insert (GTK_TOOLBAR (toolbar),
                                      GTK_TOOL_ITEM (info->proxy), pos);